// utils/cache.ts
// 带缓存的请求工具

interface CacheItem<T> {
  data: T;
  timestamp: number;
}

const cache = new Map<string, CacheItem<any>>();

/**
 * 获取缓存数据
 * @param key 缓存键
 * @param ttl 过期时间（毫秒），默认5分钟
 * @returns 缓存的数据或undefined
 */
export function getCache<T>(key: string, ttl: number = 5 * 60 * 1000): T | undefined {
  const cached = cache.get(key);
  if (cached && Date.now() - cached.timestamp < ttl) {
    return cached.data;
  }
  // 缓存过期，删除缓存
  cache.delete(key);
  return undefined;
}

/**
 * 设置缓存数据
 * @param key 缓存键
 * @param data 缓存数据
 */
export function setCache<T>(key: string, data: T): void {
  cache.set(key, {
    data,
    timestamp: Date.now()
  });
}

/**
 * 清除指定缓存
 * @param key 缓存键
 */
export function clearCache(key: string): void {
  cache.delete(key);
}

/**
 * 清除所有缓存
 */
export function clearAllCache(): void {
  cache.clear();
}

/**
 * 带缓存的异步请求函数
 * @param key 缓存键
 * @param fetcher 数据获取函数
 * @param ttl 过期时间（毫秒），默认5分钟
 * @returns 缓存或新获取的数据
 */
export async function getCachedData<T>(
  key: string, 
  fetcher: () => Promise<T>, 
  ttl: number = 5 * 60 * 1000
): Promise<{ success: boolean; data: T | null; message?: string }> {
  // 尝试从缓存获取
  const cached = getCache<T>(key, ttl);
  if (cached !== undefined) {
    return {
      success: true,
      data: cached
    };
  }

  // 缓存未命中，发起请求
  try {
    const data = await fetcher();
    // 设置缓存
    setCache(key, data);
    return {
      success: true,
      data: data
    };
  } catch (error: any) {
    return {
      success: false,
      data: null,
      message: error.message || '获取数据失败'
    };
  }
}